package org.smart4j.chapter1.util;

import org.smart4j.chapter1.helper.ClassHelper;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @ClassName: Bean 助手类
 * @Description: 用于获取所有被Smart框架管理的Bean类:
 * 此时调用ClassHelper类的getBeanClassSet方法，
 * 随后循环调用ReflectionUtil类的newInstance方法，
 * 根据类实例化对象，将每次创建的对象存放在一个静态的map&ltClass&lt?&gt,Object&gt中
 * 我们需要随时获取该map，并通过map的key（类名）去获取所对应的value（Bean对象）
 * @Author: LynnZou
 * @Date: 2017/5/27
 */
public final class BeanHelper {


    /**
     * 定义Bean映射（用于存放Bean类与Bean实例的映射关系）
     */
    private static final Map<Class<?>,Object> BEAN_MAP = new HashMap<>();

    static {
        Set<Class<?>> beanClassSet = ClassHelper.getBeanClassSet();
        for (Class<?> beanClass:beanClassSet){
            Object obj = ReflectionUtil.newInstance(beanClass);
            BEAN_MAP.put(beanClass,obj);
        }
    }

    /**
     * 获取Bean映射
     * @return
     */
    public static Map<Class<?>,Object> getBeanMap(){
        return BEAN_MAP;
    }

    /**
     * 获取Bean实例
     * @param cls
     * @param <T>
     * @return
     */
    public static<T> T getBean(Class<T> cls){

        if(!BEAN_MAP.containsKey(cls)){
            throw new RuntimeException("can not get bean by class: " + cls);
        }

        return (T)BEAN_MAP.get(cls);
    }


}
